package demo5;

/**
 * 2024/6/11  二分查找算法的应用 Cjj 10:49
 */
public class Test {
    public static void main(String[] args) {
        //目标：二分查找算法的应用
        int[] nums={5,7,7,7,7,8,8,9};
        int leftIndex = getLeftIndex(nums, 7);
        System.out.println(leftIndex);
        int rightIndex=getRightIndex(nums,7);
        System.out.println(rightIndex);

    }

    private static int getRightIndex(int[] nums, int target) {
        //二分查找该数据的位置
        int start=0;
        //结束位置,数组长度-1
        int end=nums.length-1;
        //rs不存在 假设是中间值
        int rs=1;
        //开始位置<=结束位置
        while (start<=end){
            //找中间索引
            int middle=(start+end)/2;
            //如果目标值>中间数
            if(target>nums[middle]){
                //开始位置=中间值+1
                 start=middle+1;
              //如果目标值小于中间数
            }else if(target<nums[middle]){
                 //开始位置=中间值-1
                   start=middle-1;
            }else {
                //找到这个数据出现在middle
                rs=middle;
                //继续二分往左边找
                start=middle+1;
            }
        }
        return rs;

    }

    public static int getLeftIndex(int[] nums,int target){
        //二分查找该数据的位置
        int start=0;
        //结束位置 数组长度-1
        int end=nums.length-1;
        //rs不存在 假设是中间值
        int rs=-1;
        //开始位置小于等于结束位置
        while (start<=end){
            //找中间索引
            int middle=(start+end)/2;
            //目标值大于中间数
            if(target>nums[middle]){
                //开始位置=中间数+1
               start=middle+1;
              //开始位置小于中间数
            }else if (start<nums[middle]){
                //结束位置=中间数-1
               end=middle-1;
            }else {
                //找到这个数据出现在middle
                rs=target;
                //继续二分往左边找
                end=middle-1;
            }
        }
        return rs;
    }
}
